package bean;


import java.util.Calendar;

import lang.AbstractDate;
import exception.JAFRuntimeException;

/**
 * <描述> 时间，默认格式为HH:mm:ss，默认日期为1970-1-1，若根据时间的毫秒数来实例化当前时间，也会自动将时间设置为1970-1-1
 * 
 * @author 王永弟
 * @since JDK1.4
 * @copyright 广州从兴电子开发有限公司-电子渠道业务部
 * @date 2011-5-1
 */
public class Time extends AbstractDate {
	private static final long serialVersionUID = 1L;
	/**
	 * 默认的时间格式
	 */
	private static final String DEFAULT_FORMATTER = "HH:mm:ss";

	/**
	 * 初始化时间，将日期设为初始的1970-1-1
	 */
	private void init() {
		if (cal.get(Calendar.YEAR) != 1970) {
			cal.set(Calendar.YEAR, 1970);
		}
		if (cal.get(Calendar.MONTH) != 0) {
			cal.set(Calendar.MONTH, 0);
		}
		if (cal.get(Calendar.DATE) != 1) {
			cal.set(Calendar.DATE, 1);
		}
	}

	/**
	 * <构造函数> 实例化时间，默认赋值当前系统时间
	 */
	public Time() {
		super.setFormatter(DEFAULT_FORMATTER);
		init();
	}

	/**
	 * <构造函数>根据指定的小时/分钟/秒实例化当前时间，毫秒值为0
	 * 
	 * @param hour
	 *            小时 0-23
	 * @param minute
	 *            分钟 0-59
	 * @param second
	 *            秒 0-59
	 */
	public Time(int hour, int minute, int second) {
		super.setFormatter(DEFAULT_FORMATTER);
		cal.set(1970, 0, 1, hour, minute, minute);
		cal.set(Calendar.MILLISECOND, 0);
		init();
	}

	/**
	 * 根据毫秒数实例化当前时间，并将时间设置为1970-1-1
	 * <构造函数>
	 * 
	 * @param milliseconds
	 *            毫秒数
	 */
	public Time(long milliseconds) {
		setTime(milliseconds);
	}

	@Override
	public void setTime(long milliseconds) {
		cal.setTimeInMillis(milliseconds);
		super.setFormatter(DEFAULT_FORMATTER);
		init();
	}

	/**
	 * <方法描述> 获取小时，为24小时日期格式，0-23
	 * 
	 * @return 小时
	 */
	public int getHour() {
		return cal.get(Calendar.HOUR_OF_DAY);
	}

	/**
	 * <方法描述> 获取分钟数，0-59
	 * 
	 * @return 分钟
	 */
	public int getMinute() {
		return cal.get(Calendar.MINUTE);
	}

	/**
	 * <方法描述> 获取秒数，0-59
	 * 
	 * @return 秒
	 */
	public int getSecond() {
		return cal.get(Calendar.SECOND);
	}

	/**
	 * <方法描述> 时间操作，可增加或减少小时数，若默认日期不等于1970-1-1，则重新设置为1970-1-1
	 * 
	 * @param hour
	 *            负数为减少，正数为增加
	 */
	public void addHour(int hour) {
		cal.add(Calendar.HOUR_OF_DAY, hour);
		init();
	}

	/**
	 * <方法描述> 分钟操作，可增加或减少分钟，若默认日期不等于1970-1-1，则重新设置为1970-1-1
	 * 
	 * @param minute
	 *            负数为减少，正数为增加
	 */
	public void addMinute(int minute) {
		cal.add(Calendar.MINUTE, minute);
		init();
	}

	/**
	 * <方法描述> 日期操作，可增加或减少秒，若默认日期不等于1970-1-1，则重新设置为1970-1-1
	 * 
	 * @param second
	 *            负数为减少，正数为增加
	 */
	public void addSecond(int second) {
		cal.add(Calendar.SECOND, second);
		init();
	}

	/**
	 * <方法描述> 修改小时数，值为0-23，若默认日期不等于1970-1-1，则重新设置为1970-1-1
	 * 
	 * @param hour
	 *            小时数
	 */
	public void setHour(int hour) {
		cal.set(Calendar.HOUR_OF_DAY, hour);
		init();
	}

	/**
	 * <方法描述> 修改分钟数，值为0-59，若默认日期不等于1970-1-1，则重新设置为1970-1-1
	 * 
	 * @param minute
	 *            分钟数
	 */
	public void setMinute(int minute) {
		cal.set(Calendar.MINUTE, minute);
		init();
	}

	/**
	 * <方法描述> 修改秒数，值为0-59，若默认日期不等于1970-1-1，则重新设置为1970-1-1
	 * 
	 * @param second
	 *            秒数
	 */
	public void setSecond(int second) {
		cal.set(Calendar.SECOND, second);
		init();
	}

	/**
	 * <方法描述> 将指定的字符串，根据指定格式，转化为时间
	 * 
	 * @param str
	 *            时间字符串
	 * @param formatter
	 *            时间对应的格式
	 * @return 时间对象
	 * @throws JAFRuntimeException
	 *             无法转换时抛出
	 */
	public static Time parse(String str, String formatter) {
		return AbstractDate.parse(str, formatter, Time.class);
	}

	/**
	 * <方法描述> 将指定的字符串，根据默认格式"HH:mm:ss"，转化为时间
	 * 
	 * @param str
	 *            时间字符串
	 * @return 时间对象
	 * @throws JAFRuntimeException
	 *             无法转换时抛出
	 */
	public static Time parse(String str) {
		return AbstractDate.parse(str, DEFAULT_FORMATTER, Time.class);
	}
}
